package com.atguigu.jxc.dao;

import com.atguigu.jxc.entity.Goods;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @description 商品信息
 */
public interface GoodsDao {


    String getMaxCode();


    /**
     * 分页查询商品库存信息
     * @param start 当前页
     * @param rows 每页显示条数
     * @param codeOrName 商品编码或名称
     * @param goodsTypeId 商品类别ID
     * @return
     */
    List<Goods> listInventory(@Param("start") Integer start, @Param("rows") Integer rows, @Param("codeOrName") String codeOrName, @Param("goodsTypeId") Integer goodsTypeId);

    /**
     * 查询库存总记录数
     * @return
     */
    Integer selectCount();

    /**
     * 分页查询商品信息
     * @param start 当前页
     * @param rows 每页显示条数
     * @param goodsName 商品名称
     * @param goodsTypeId 商品类别ID
     * @return
     */
    List<Goods> selectGoodsListPage(@Param("start") int start, @Param("rows") Integer rows, @Param("goodsName") String goodsName, @Param("goodsTypeId") Integer goodsTypeId);

    /**
     * 添加商品信息
     * @param goods
     */
    void insert(@Param("goods") Goods goods);

    /**
     * 删除商品信息
     * @param goodsId
     * @param goods
     */
    void update(@Param("goodsId") Integer goodsId, @Param("goods") Goods goods);

    /**
     * 删除商品信息
     * @param goodsId
     */
    void delete(@Param("goodsId") Integer goodsId);

    /**
     * 分页查询无库存商品信息
     * @param start 当前页
     * @param rows 每页显示条数
     * @param codeOrName 商品编码或名称
     * @return
     */
    List<Goods> selectNoInventoryQuantityPage(@Param("start") int start, @Param("rows") Integer rows, @Param("codeOrName") String codeOrName);

    /**
     * 查询无库存的商品数量
     * @return
     */
    Integer selectNoInventoryQuantityCount();

    /**
     * 分页查询有库存商品信息
     * @param start 当前页
     * @param rows 每页显示条数
     * @param codeOrName 商品编码或名称
     * @return
     */
    List<Goods> selectHasInventoryQuantityPage(@Param("start") int start, @Param("rows") Integer rows, @Param("codeOrName") String codeOrName);

    /**
     * 查询有库存的商品数量
     * @return
     */
    Integer selectHasInventoryQuantityCount();

    /**
     * 添加商品期初库存
     * @param goodsId 商品ID
     * @param inventoryQuantity 库存
     * @param purchasingPrice 成本价
     * @return
     */
    void saveStock(@Param("goodsId") Integer goodsId, @Param("inventoryQuantity") Integer inventoryQuantity, @Param("purchasingPrice") double purchasingPrice);

    /**
     * 查询商品信息
     * @param goodsId
     * @return
     */
    Goods selectOne(@Param("goodsId") Integer goodsId);

    /**
     * 删除商品库存
     * @param goodsId
     */
    void deleteStock(@Param("goodsId") Integer goodsId);

    /**
     * 报损减库存
     * @param goodsId 商品ID
     * @param goodsNum 商品扣减库存
     */
    void subtractStock(@Param("goodsId") Integer goodsId,@Param("goodsNum") Integer goodsNum);

    /**
     * 报溢加库存
     * @param goodsId 商品ID
     * @param goodsNum 商品扣减库存
     */
    void addStock(@Param("goodsId") Integer goodsId, @Param("goodsNum") Integer goodsNum);

    /**
     * 查询库存报警商品信息
     * @return
     */
    List<Goods> listAlarm();


    /**
     * 修改上次采购价格和采购价格
     * @param goodsId
     * @param price
     */
    void updateLastPurchasingPrice(@Param("goodsId") Integer goodsId, @Param("price") double price, @Param("state") Integer state);

    /**
     * 修改商品状态
     * @param goodsId 商品ID
     * @param state 0表示初始值,1表示已入库，2表示有进货或销售单据
     */
    void updateGoodsState(@Param("goodsId") Integer goodsId, @Param("state") int state);
}
